package com.dz.risk.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dz.risk.common.ResponseVO;
import com.dz.risk.dao.ListOfDefaultedBondsDao;
import com.dz.risk.pojo.domain.ListOfDefaultedBonds;
import com.dz.risk.pojo.model.CommonPageResult;
import com.dz.risk.pojo.model.PageModel;
import com.dz.risk.service.ListOfDefaultedBondsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Date;
import java.util.List;

/**
 * 违约债券名单业务处理控制层
 *
 * @author Doke
 * @date 2021/7/7 15:28
 */
@Service
public class ListOfDefaultedBondsServiceImpl extends ServiceImpl<ListOfDefaultedBondsDao, ListOfDefaultedBonds> implements ListOfDefaultedBondsService {

    private final ListOfDefaultedBondsDao listOfDefaultedBondsDao;

    @Autowired
    public ListOfDefaultedBondsServiceImpl(ListOfDefaultedBondsDao listOfDefaultedBondsDao) {
        this.listOfDefaultedBondsDao = listOfDefaultedBondsDao;
    }

    /**
     * 新增违约债券名单
     *
     * @param listOfDefaultedBonds 债卷违约名单实体
     * @return 新增结果
     */
    @Override
    public ResponseVO add(ListOfDefaultedBonds listOfDefaultedBonds) {
        //账面价值=账面余额-已计提减值准备
        listOfDefaultedBonds.setBookValue(listOfDefaultedBonds.getBookBalance().subtract(listOfDefaultedBonds.getImpairmentProvisionsHaveBeenSetAside()));
        listOfDefaultedBondsDao.insert(listOfDefaultedBonds);
        return ResponseVO.ok();
    }

    /**
     * 根据债卷查重规则查询是否已有规则内重复数据
     *
     * @param listOfDefaultedBonds 违约债卷名单信息实体
     * @return 违约债卷名单集合
     */
    @Override
    public List<ListOfDefaultedBonds> selectDuplicateByBondCodeOrBeginDateOrEndDateOrId(ListOfDefaultedBonds listOfDefaultedBonds) {
        QueryWrapper<ListOfDefaultedBonds> wrapper = new QueryWrapper<>();
        wrapper.lambda()
                .ne(!StringUtils.isEmpty(listOfDefaultedBonds.getId()), ListOfDefaultedBonds::getId, listOfDefaultedBonds.getId())
                .eq(ListOfDefaultedBonds::getBondCode, listOfDefaultedBonds.getBondCode())
                .and(w -> w.and(a -> a.le(ListOfDefaultedBonds::getBeginDate, listOfDefaultedBonds.getBeginDate()).ge(ListOfDefaultedBonds::getEndDate, listOfDefaultedBonds.getBeginDate()))
                        .or(b -> b.le(ListOfDefaultedBonds::getBeginDate, listOfDefaultedBonds.getEndDate()).ge(ListOfDefaultedBonds::getEndDate, listOfDefaultedBonds.getEndDate())));

        return listOfDefaultedBondsDao.selectList(wrapper);
    }

    /**
     * 分页查询违约债卷信息
     *
     * @param pageModel 分页模型
     * @param bondName  债卷名称
     * @param bondCode  债卷代码
     * @param beginDate
     * @param endDate
     * @return 违约债卷信息集合
     */
    @Override
    public CommonPageResult pageList(PageModel pageModel, String bondName, String bondCode, Long beginDate, Long endDate) {
        //分页查询违约债卷信息
        QueryWrapper<ListOfDefaultedBonds> wrapper = new QueryWrapper<>();
        wrapper.lambda()
                .eq(!StringUtils.isEmpty(beginDate), ListOfDefaultedBonds::getBeginDate,beginDate)
                .eq(!StringUtils.isEmpty(endDate),ListOfDefaultedBonds::getEndDate, endDate)
                .like(!StringUtils.isEmpty(bondName), ListOfDefaultedBonds::getBondName, bondName)
                .eq(!StringUtils.isEmpty(bondCode), ListOfDefaultedBonds::getBondCode, bondCode);

        Page<ListOfDefaultedBonds> listOfDefaultedBondsPage = listOfDefaultedBondsDao.selectPage(new Page<>(pageModel.getPageNum(), pageModel.getPageSize()), wrapper);

        return CommonPageResult
                .builder()
                .data(listOfDefaultedBondsPage.getRecords())
                .pages(listOfDefaultedBondsPage.getPages())
                .rows(pageModel.getPageSize())
                .total(listOfDefaultedBondsPage.getTotal())
                .page(pageModel.getPageNum())
                .build();
    }

    /**
     * 更新违约债券名单信息
     *
     * @param listOfDefaultedBonds 违约债券名单实体
     * @return 更新结果
     */
    @Override
    public ResponseVO updateByListOfDefaultedBondsId(ListOfDefaultedBonds listOfDefaultedBonds) {
        //账面价值=账面余额-已计提减值准备
        listOfDefaultedBonds.setBookValue(listOfDefaultedBonds.getBookBalance().subtract(listOfDefaultedBonds.getImpairmentProvisionsHaveBeenSetAside()));
        listOfDefaultedBondsDao.updateById(listOfDefaultedBonds);
        return ResponseVO.ok();
    }
}
